iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Web 3

從BlockChain看Web3系列 第 10

[Day 10] Tutorial -Step 4: 實作 BasicCoin module

  • 分享至 

  • xImage
  •  

切換到 step_4/BasicCoin

move build

現在實作Method如下列BasicCoin.move範例裡的結構:

  1. publish_balance

此方法將Balance資源發佈到給定位址。由於需要該資源透過鑄造或轉移來接收硬幣,因此publish_balance用戶(包括模組所有者)必須調用該方法才能接收資金。

此方法使用一個move_to操作來發布資源:

let empty_coin = Coin { value: 0 };
move_to(account, Balance { coin: empty_coin });

  1. mint

mint方法將硬幣鑄造到給定帳戶。這裡我們要求mint必須經過模組所有者的批准。我們使用斷言語句強制執行此操作:

assert!(signer::address_of(&module_owner) == MODULE_OWNER, ENOT_MODULE_OWNER);

然後我們將一枚價值為的amount代幣存入餘額mint_addr。

deposit(mint_addr, Coin { value: amount });

  1. balance_of

我們使用borrow_global全域儲存運算子之一來從全域儲存中讀取。

borrow_global<Balance>(owner).coin.value
| | \ /
resource type address field names

  1. transfer

此函數從 的餘額中提取代幣from並將代幣存入tos 的餘額中。我們仔細看看withdraw輔助函數:

fun withdraw(addr: address, amount: u64) : Coin acquires Balance {
let balance = balance_of(addr);
assert!(balance >= amount, EINSUFFICIENT_BALANCE);
let balance_ref = &mut borrow_global_mut<Balance>(addr).coin.value;
*balance_ref = balance - amount;
Coin { value: amount }
}

在方法開始時,我們斷言提款帳戶有足夠的餘額。然後,我們用於borrow_global_mut 取得對全域儲存的可變引用,並&mut用於建立對結構體欄位的可變引用。然後,我們透過這個可變引用修改餘額,並返回帶有提取金額的新硬幣。


上一篇
[Day 9] Tutorial -Step 3:設計我的 BasicCoin module
下一篇
[Day 11] Tutorial-Step 5: BasicCoin module 加上Unit Test
系列文
從BlockChain看Web330
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言